package Exercise;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
 *         实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
 *         其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
 *         最终再汇总两个和, 进行相加
 *         记录程序的执行时间.
 */



public class demo2 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long start=System.currentTimeMillis();

       //创建数组+放置随机数
        int[] arr=new int[1000_0000];
        Random random=new Random();
        for(int i=0;i<arr.length;i++){
            arr[i]=random.nextInt(100)+1;
            //System.out.println(arr[i]);
        }

        /**
         * 带返回值的任务类Callable
         * 计算数组的偶数和
         */
        Callable<Integer> callable=new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=0;i<arr.length;i+=2){
                    sum+=arr[i];
                }
                return sum;
            }
        } ;
        FutureTask<Integer> futureTask=new FutureTask<>(callable);
        Thread t1=new Thread(futureTask);
        t1.start();
        int a=futureTask.get();


        /**
         * 计算数组的奇数和
         */
        Callable<Integer> callable2=new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=1;i<arr.length;i+=2){
                    sum+=arr[i];
                }
                return sum;
            }
        } ;
        FutureTask<Integer> futureTask2=new FutureTask<>(callable);
        Thread t2=new Thread(futureTask);
        t2.start();
        int b=futureTask.get();

        t1.join();
        t2.join();

        int sum=a+b;
        System.out.println(sum);

        long end=System.currentTimeMillis();
        System.out.println("执行时间"+ (end-start));




    }
}
